SublimeSocketAssetに補完機能つけた


概要

Sublime Textを使ってUnityのコードを書いていたのだけれど、


Sublime Text用に用意されていたUnityのス二ペットが不正確や不足で不満だった。


また、補完機構のプラグインも有ったのだけれど、

中身がexeでWin向けだけ & 自分の作った部分の補完とかの設定が面倒だった。


ので、

SublimeSocketAssetに機能追加する形で実装した。


現行verの1.5.2ではなく、申請済みの1.6.xから動作するようになる。

なんとなく、今のうちに買っておく事をオススメする。


Unityの基底クラスや、SystemなどのC#関連、自分の書いたコードや、

プロジェクト中で使っている他のAssetの情報も含めて補完している。


ヒャッホーゥゥゥ!! 快適快適!!


Win版

https://vimeo.com/71184393



Mac版

https://vimeo.com/71184153



補完開始から終了まで非同期で動くので、ユーザー操作を全くロックせず補完が出せる。 

補完速度もそれなりに速い、はず。 最大量でも0.3秒くらい。

全盛期のころのEcliなんとかを凌駕したかった。


そしてなによりSublime Textのファジィーな入力候補選定が使い放題なので(ry


日に日に「あ、あれなんてクラスだったっけ、、T、、Tが2個くらい入ってた気がする、、」とか

使う側の残念さが仕上がっていく。 俺はもう駄目だ。



補完候補の絞り込みとかはそれなりに頑張って作らないと不愉快な感じだったので、頑張ってみた。

なんというか修正やメンテも含めて、改善しやすい感じに出来たと思う。



仕組み

Unityが吐き出したdllを解析している。


候補選定はScalaコンパイラ用に別口で作った機構を流用できたので、楽勝だぜーと思っていたのだが、

言語やUnityのコンパイラとしての前提、静的解析できる機構の有無があり、結局似ても似つかなくなった。


大きく役割分担を分けて書くと、


Sublime Text側

Sublime Text : View

SublimeSocket : 接続機構、viewデータ送付、補完候補の受信、STのAPI実行


Unity側

SublimeSocketAsset : viewデータ解析、dll解析、補完候補選定、SublimeSocketへと送付

Unity : 動作環境


という感じになっている。



内輪話になるけど、Unityの「コンパイルする際には全Assetもリロードされる」という仕様と

補完情報の持ち方の兼ね合いが、作っていてとても面白かった。


必ず

・Unityが全てをコンパイル

・コンパイル完了後にEditor系のAssetが起動

・ゲームのコードが~

みたいな挙動順になる。

で、出来るだけ速くコンパイル後の補完準備が完了するように、並列でいろいろ処理してみた。


完全に変化しないSystem系やUnity系のライブラリが膨大で、これをマトモにコンパイル後に展開すると

平気で4秒とかかかるので却下しつつ、キャッシュ作ったり、圧縮したりして高速化。


最終的には、コンパイル後の静的解析が1.7秒、並行で走るキャッシュ展開が1.8秒、なので

保存から1.8秒くらいで全ての用意ができる。



Unityのプラグインは並列動作みたいなのができないと思っていたんだけど、 WebSocketの受信からだと並行し放題みたいだ。


ただ暗黙のタイムアウトみたいなのがあって、10秒?以上走るような重いものを動かすと、

いつのまにかやめてるような気がした。ポーリングやSignalPingPongみたいなのは止めておいた方が平和そう。



現状

Mac,Win向けに調整が終わって、土曜に申請済み。

さてはて。



これから

補完機構を作っていて、どうも、コードブロックごとの時間表時などがリアルタイムで

出来そうなので、気が向いたら作る。


Unityみたいなゲームで使うのだと、なかなか嬉しい。


あとやっぱりSTに自由描画レイヤーが欲しい。png貼らせてくんないかなー。

そしたらLLVMでの解析とかunreachableBlockとかが図示できる。